#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
#include <stdlib.h>
#include <pthread.h>

//要求：计算一组数字的平方值并进行累加。

int calc_sqr(int  a  )
{    
    sleep(1);
    return a*a;
}

void *  calc_sqr_join(void *arg)
{    sleep(1);
    int *p = (int *)arg; //强转
    int i=  *p ;//解引用 获得值 
    int *result = malloc(sizeof(int)); //申请内存
    *result = i*i; //把值放入地址
    return (void *) result; 
}



int main(int argc, char const *argv[])
{
    
    // 1 声明一组数值 
    int a[5] = {1,2,3,4,5};
    int result[5]= {0};
    int sum=0;
    //获得当前系统的秒数时间戳
    struct timeval  start,end;
    gettimeofday(&start,NULL);
 

    // 2 计算每个值的平方值  
    pthread_t tids[5];
    for (int i = 0; i < 5; i++)
    {
        //result[i] = calc_sqr(a[i]);
        // b声明线程id对象
        
        // 创建线程
        pthread_create(&tids[i],NULL,calc_sqr_join,&a[i]);
    }

    //获得a计算结果
    for (int i = 0; i < 5; i++)
    {   // 创建一个指针
        void *result_p;
        //等待线程结束
        pthread_join(tids[i],&result_p);
        // 解引用指针
        int *result_int_p= (int *)result_p; //强制类型转换
        int result_int= *result_int_p;//解引用 取值 
        result[i]=result_int; //赋给结果集
        free(result_p);
    }

     gettimeofday(&end,NULL);
    printf("time=%ld秒\n",end.tv_sec-start.tv_sec);

    //3 把这组平方值 加起来 
    for (int i = 0; i < 5; i++)
    {    
        sum += result[i];
    }
    printf("sum=%d\n",sum);
    return 0;
}
